/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.hamacekj.dotaznikserver;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * Třída statických funkcí, které zobrazují dialogová okna pro vytváření
 * všech druhů otázek.
 * @author Jan Hamáček
 */
public class QuestionDialogs {
    
    /**
     * Zobrazí modální dialog k vytvoření otázky typu Ano/Ne. Vrací objekt YNQuestion nebo null, pokud byl dialog zrušen.
     * @param owner Předchůdce, kterého bude modální dialog blokovat.
     * @return Objekt YNQuestion s id nastaveným na -1 nebo null, pokud byl dialog zrušen.
     */
    public static YNQuestion showYNQuestionDialog(Frame owner){
        QuestionDialogs qd = new QuestionDialogs();
        qd.dialog = new JDialog(owner, "Nová otázka Ano/Ne", true);
        qd.dialog.setPreferredSize(new Dimension(400, 300));
        qd.acceptResult = false;
        qd.dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
        Container pane = qd.dialog.getContentPane();
        pane.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(10, 10, 10, 10); c.gridwidth = 2; c.weightx = 1;
        c.fill = GridBagConstraints.HORIZONTAL;
        pane.add(new JLabel("<html>Potvrzením tohoto formuláře odešlete všem připojeným počítačům otázky Ano/Ne."
                + System.lineSeparator()
                + "<br>Volitelně můžete napsat znění otázky:</html>"), c);
        c.gridy = 1; c.weighty = 1; c.weightx = 1; c.fill = GridBagConstraints.BOTH;
        JTextArea textArea = new JTextArea();
        textArea.setFont(textArea.getFont().deriveFont(14f));
        textArea.setLineWrap(true);
        pane.add(textArea, c);
        JButton okButton = new JButton("Odeslat");
        JButton cancelButton = new JButton("Zrušit");
        okButton.addActionListener(qd.new okActionListener());
        cancelButton.addActionListener(qd.new cancelActionListener());
        c.gridy = 2; c.gridwidth = 1; c.weightx = 1; c.weighty = 0;
        c.anchor = GridBagConstraints.EAST; c.fill = GridBagConstraints.NONE;
        pane.add(okButton, c);
        c.gridx = 1; c.weightx = 0;
        pane.add(cancelButton, c);
        qd.dialog.pack();
        qd.dialog.setVisible(true);
        if(qd.acceptResult == false){
            return null;
        }
        String message = textArea.getText();
        return new YNQuestion(-1, message);
    }
    
     /**
     * Zobrazí modální dialog k vytvoření textové otázky. Vrací objekt TextQuestion nebo null, pokud byl dialog zrušen.
     * @param owner Předchůdce, kterého bude modální dialog blokovat.
     * @return Objekt TextQuestion s id nastaveným na -1 nebo null, pokud byl dialog zrušen.
     */
    public static TextQuestion showTextQuestionDialog(Frame owner){
        QuestionDialogs qd = new QuestionDialogs();
        qd.dialog = new JDialog(owner, "Nová textová otázka", true);
        qd.dialog.setPreferredSize(new Dimension(400, 300));
        qd.acceptResult = false;
        qd.dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
        Container pane = qd.dialog.getContentPane();
        pane.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(10, 10, 10, 10); c.gridwidth = 2; c.weightx = 1;
        c.fill = GridBagConstraints.HORIZONTAL;
        pane.add(new JLabel("<html>Potvrzením tohoto formuláře odešlete všem připojeným počítačům textové otázky."
                + System.lineSeparator()
                + "<br>Volitelně můžete napsat znění otázky:</html>"), c);
        c.gridy = 1; c.weighty = 1; c.weightx = 1; c.fill = GridBagConstraints.BOTH;
        JTextArea textArea = new JTextArea();
        textArea.setFont(textArea.getFont().deriveFont(14f));
        textArea.setLineWrap(true);
        pane.add(textArea, c);
        JButton okButton = new JButton("Odeslat");
        JButton cancelButton = new JButton("Zrušit");
        okButton.addActionListener(qd.new okActionListener());
        cancelButton.addActionListener(qd.new cancelActionListener());
        c.gridy = 2; c.gridwidth = 1; c.weightx = 1; c.weighty = 0;
        c.anchor = GridBagConstraints.EAST; c.fill = GridBagConstraints.NONE;
        pane.add(okButton, c);
        c.gridx = 1; c.weightx = 0;
        pane.add(cancelButton, c);
        qd.dialog.pack();
        qd.dialog.setVisible(true);
        if(qd.acceptResult == false){
            return null;
        }
        String message = textArea.getText();
        return new TextQuestion(-1, message);
    }
    
     /**
     * Zobrazí modální dialog k vytvoření otázky s více možnostmi. Vrací objekt RadioQuestion nebo null, pokud byl dialog zrušen.
     * @param owner Předchůdce, kterého bude modální dialog blokovat.
     * @return Objekt RadioQuestion s id nastaveným na -1 nebo null, pokud byl dialog zrušen.
     */
    public static RadioQuestion showRadioQuestionDialog(Frame owner){
        final QuestionDialogs qd = new QuestionDialogs();
        qd.dialog = new JDialog(owner, "Nová otázka s výběrem možností", true);
        qd.dialog.setPreferredSize(new Dimension(400, 500));
        qd.acceptResult = false;
        qd.dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
        Container pane = qd.dialog.getContentPane();
        pane.setLayout(new BorderLayout());
        final JPanel first = new JPanel();
        first.setLayout(new GridBagLayout());
        final GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(10, 10, 10, 10); c.gridwidth = 2; c.weightx = 1;
        c.fill = GridBagConstraints.HORIZONTAL;
        first.add(new JLabel("<html>Potvrzením tohoto formuláře odešlete všem"
                + " připojeným počítačům otázky s výběrem více možností."
                + " Níže můžete nastavit počet možností a text u každé z nich."
                + System.lineSeparator()
                + "<br>Volitelně můžete napsat znění otázky:</html>"), c);
        c.gridy = 1; c.weighty = 1; c.weightx = 1; c.fill = GridBagConstraints.BOTH;
        JTextArea textArea = new JTextArea();
        textArea.setFont(textArea.getFont().deriveFont(14f));
        textArea.setMinimumSize(new Dimension(0, 100));
        textArea.setLineWrap(true);
        first.add(textArea, c);
        c.gridy = 2; c.weighty = 0; c.fill = GridBagConstraints.HORIZONTAL;
        first.add(new JLabel("Seznam možností:"), c);
        final LinkedList<JTextField> fields = new LinkedList<>();
        c.gridwidth = 1; c.insets = new Insets(0, 0, 0, 0);
        for(int i = 0; i < 2; i++){
            qd.addOption(first, fields, c);
        }
        JPanel second = new JPanel();
        second.setLayout(new GridBagLayout());
        GridBagConstraints con = new GridBagConstraints();
        JButton addButton = new JButton("Přidat možnost");
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                qd.addOption(first, fields, c);
                first.validate();
                first.repaint();
            }
        });
        con.gridwidth = 2; con.weightx = 1; con.anchor = GridBagConstraints.WEST;
        second.add(addButton, con);
        JButton okButton = new JButton("Odeslat");
        JButton cancelButton = new JButton("Zrušit");
        okButton.addActionListener(qd.new okActionListener());
        cancelButton.addActionListener(qd.new cancelActionListener());
        con.gridy = 1; con.gridwidth = 1; con.weightx = 1; con.weighty = 0;
        con.anchor = GridBagConstraints.EAST; con.fill = GridBagConstraints.NONE;
        second.add(okButton, con);
        con.gridx = 1; con.weightx = 0;
        second.add(cancelButton, con);
        pane.add(first, BorderLayout.CENTER);
        pane.add(second, BorderLayout.SOUTH);
        qd.dialog.pack();
        qd.dialog.setVisible(true);
        if(qd.acceptResult == false){
            return null;
        }
        String message = textArea.getText();
        RadioQuestion question = new RadioQuestion(-1, message);
        int i = 0;
        for(JTextField field:fields){
            String option = field.getText();
            if(option == null || "".equals(option)){
                char ch = (char)('A'+i);
                // WARNING: pokud bude vic nez 26 moznosti, zacne to vylejzat z abecedy
                option = Character.toString(ch);
            }
            question.addOption(option);
            i++;
        }
        return question;
    }
    
    private void addOption(final Container pane, final LinkedList<JTextField> fields , final GridBagConstraints c){
        c.gridy++; c.gridx = 0; c.weightx = 1;
        final JTextField field = new JTextField();
        fields.add(field);
        pane.add(field, c);
        final JButton button = new JButton("Odebrat");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fields.removeLastOccurrence(field);
                pane.remove(field);
                pane.remove(button);
                pane.validate();
                pane.repaint();
            }
        });
        c.gridx = 1; c.weightx = 0;
        pane.add(button, c);
    }
    
    private class okActionListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            acceptResult = true;
            dialog.setVisible(false);
        }
    }
    
    private class cancelActionListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            dialog.setVisible(false);
        }
    }
    
    private JDialog dialog;
    private boolean acceptResult = false;
}
